const fs = require('fs');
const md5 = require('md5');
const path = require('path');
const cors = require('cors');
const express = require('express');

const exp = express();

// 启用跨域中间件
exp.use(cors());
// 启用 JSON 解析中间件
exp.use(express.json());

exp.all('*', (req, res, next) => {
	const safePassword = req.headers.authorization;

	try {
		// 真实密码
		const readPassword = fs.readFileSync(path.join(__dirname, 'safePassword.key')).toString();
		const realPassword = md5(readPassword);

		// 密码验证
		if (safePassword === `Bearer ${realPassword}`) {
			next();
			return;
		}

		res.send({
			code: 401,
			message: '密码错误',
		});
	} catch (error) {
		res.send({
			code: 500,
			message: error.message,
		});
	}
});

// 读取笔记列表
let noteList = [];
try {
	const notes = fs.readFileSync(path.join(__dirname, '/db/notes.db.json')).toString();
	noteList = JSON.parse(notes);
} catch (error) {
	console.error(`读取笔记列表失败：${error.message}`);
	return;
}

// 更新 JSON 文件
const updateJsonFile = (newData) => {
	fs.writeFileSync(path.join(__dirname, '/db/notes.db.json'), JSON.stringify(newData));
};

// 获取笔记列表
exp.get('/list', (req, res) => {
	res.send({ code: 200, list: noteList, message: '获取笔记列表成功' });
});

// 添加一条笔记
exp.post('/add', (req, res) => {
	const note = req.body.note; // 获取请求参数
	if (!note || typeof note !== 'object' || !note.id) {
		res.send({
			code: 400,
			message: '参数错误',
		});
		return;
	}

	try {
		// 首先检查笔记是否已存在
		if (noteList.length < 1) {
			noteList.push({ ...note });
			res.send({
				code: 200,
				message: '同步成功',
			});
			return;
		}

		const index = noteList.findIndex((item) => item.id === note.id);
		if (index !== -1) {
			noteList[index] = { ...note };
			res.send({
				code: 200,
				message: '同步成功',
			});
			return;
		}

		noteList.push({ ...note });
		res.send({
			code: 200,
			message: '同步成功',
		});
	} finally {
		updateJsonFile(noteList); // 更新 JSON 文件
	}
});

// 删除一条笔记
exp.delete('/delete', (req, res) => {
	const noteId = req.query.id; // 获取请求参数
	if (!noteId || typeof noteId !== 'string') {
		res.send({
			code: 400,
			message: '参数错误',
		});
		return;
	}

	try {
		const index = noteList.findIndex((item) => item.id === noteId);
		if (index !== -1) {
			noteList.splice(index, 1);
			res.send({
				code: 200,
				message: '同步成功',
			});
			return;
		}

		res.send({
			code: 404,
			message: '未找到该笔记',
		});
	} finally {
		updateJsonFile(noteList); // 更新 JSON 文件
	}
});

// 同步笔记列表
exp.post('/sync', (req, res) => {
	const notes = req.body.notes; // 获取请求参数
	if (!notes || !Array.isArray(notes) || notes.length < 1) {
		res.send({
			code: 400,
			message: '参数错误',
		});
		return;
	}

	try {
		// 现有笔记的 ID 列表
		notes.forEach((note) => {
			const oldIds = noteList.map((item) => item.id);

			if (!note.id) {
				res.send({
					code: 400,
					message: '参数错误',
				});
				return;
			}

			// 若 ID 已存在，则更新该笔记
			const index = oldIds.findIndex((id) => id === note.id);
			if (index !== -1) {
				noteList[index] = { ...note };
				return;
			}

			// 若 ID 不存在，则添加该笔记
			noteList.push({ ...note });
		});

		res.send({
			code: 200,
			message: '同步成功',
		});
	} finally {
		updateJsonFile(noteList); // 更新 JSON 文件
	}
});

// 启动服务器
const port = 3000;
exp.listen(port, () => {
	console.log(`服务器运行在 http://localhost:${port}`);
});
